package com.lailai.entity.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author lgr
 * @Description 路由视图对象，用于前后端交互的路由结构
 * @Date 2025/7/11
 * @Wechat a983105834
 * @Email 983105834@qq.com
 * @Copyright <a href="www.lailai.ink">lailai个人空间</a>
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RouteVO {
    /**
     * 路由ID
     */
    private Long id;
    /**
     * 路由名称，必须唯一
     */
    private String name;

    /**
     * 路由路径，建议以 / 开头
     */
    private String path;

    /**
     * 组件路径，用于加载路由组件
     */
    private String componentPath;

    /**
     * 重定向配置，当匹配此路由时跳转到指定路径
     */
    private String redirect;

    /**
     * 自定义元数据
     */
    private Meta meta;

    /**
     * 子路由列表
     */
    private List<RouteVO> children;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Meta {
        /**
         * 父级路由ID
         */
        private Long parentId;
        /**
         * 路由标题
         */
        private String title;
        /**
         * 是否将参数作为 props 传入组件
         */
        private Map<String, Object> props;
        /**
         * 路由层级
         */
        private Integer level;

        /**
         * 路由排序，用于排序路由
         */
        private Integer sort;

        /**
         * 路由状态，0 表示正常，1 表示禁用
         */
        private Integer status;

        /**
         * 路由图标
         */
        private String icon;

        /**
         * 是否隐藏路由
         */
        private Boolean hidden;

        /**
         * 是否保持活跃（缓存）
         */
        private Boolean keepAlive;

        /**
         * 是否需要认证
         */
        private Boolean requiresAuth;

        /**
         * 路由权限列表
         */
        private List<String> permissions;

        /**
         * 所需角色列表
         */
        private List<String> roles;

        /**
         * 是否固定标签
         */
        private Boolean affix;

        /**
         * 是否显示面包屑
         */
        private Boolean breadcrumb;

        /**
         * 是否缓存页面
         */
        private Boolean noCache;

        /**
         * 导航守卫标识
         */
        private List<String> beforeEnter;

        /**
         * 创建时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date createTime;

        /**
         * 更新时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date updateTime;
    }
}